#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char const *argv[])
{
    printf("父/main(%d)进程开始执行\n", getpid());

    // 创建一个子进程
    pid_t pid = fork();
    if (pid == 0) // 子进程
    {
        printf("子进程(%d)开始执行\n", getpid());

        // 使用execve函数执行另一个程序(bin下的命令程序)
        char *path = "/bin/ping";
        char *argv[] = {path, "-c", "5", "www.baidu.com", NULL}; // 数组的最后一个元素必须为NULL
        char *envp[] = {NULL};  // 环境变量数组，最后一个元素必须为NULL
        // execve如果执行成功，则不会返回，如果执行失败，则返回-1
        int result = execve(path, argv, NULL);  // NULL代表使用默认的环境变量
        printf("execve执行失败，result = %d\n", result);
        return -1;

    }
    else if(pid > 0)  // 父进程  pid为子进程的id
    { 
        printf("父进程(%d)继续执行\n", getpid());

        // 等待子进程结束, 并得到结果状态值
        int status;
        waitpid(pid, &status, 0);  // 0代表真等，阻塞式等待
        printf("父进程等待子进程(%d)结束了，状态值 = %d\n", pid, status);
    }

    printf("进程(%d)即将退出 \n", getpid());
    return 0;
}
